/*
 * APlusCalendar.java
 *December 30, 2014,Finals
 *  Finals Completion Project
 *
 * The following codes are the work of the IT.WORKS team in   
 * fulfillment of the requirement for Programming Applications
 * class code 9607. Copying of this work will result to 
 * serious consequences both to the IT.WORKs team and the plagiarizing 
 * party
 */

import java.util.Scanner;
import java.util.GregorianCalendar;

/**
 * This program is the class that prints a calendar
 *
 * @author 2132446 Matib,Nicole
  * @edited by 2132446
 *		-  added date line
 *
 * @version 2.0.6
 */
public class APlusCalendar {
	
	
	
	   public APlusCalendar() {
	   	        Scanner input = new Scanner(System.in);
        GregorianCalendar date = new GregorianCalendar();

        int year = date.get(GregorianCalendar.YEAR);
        int month = date.get(GregorianCalendar.MONTH) + 1;

        System.out.println();

        printMonth(year, month);
	   	   
	   }



     public  void printMonth(int year, int month) {

        printMonthTitle(year, month);
        printMonthBody(year, month);
    }

     public   void printMonthTitle(int year, int month) {
        System.out.println("         " + getMonthName(month) + " " + year);
        System.out.println("-----------------------------");
        System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
    }
    
    

 public String getMonthName(int month) {
        String monthName = "";

        switch (month) {
            case 1:
                monthName = "January";
                break;
            case 2:
                monthName = "February";
                break;
            case 3:
                monthName = "March";
                break;
            case 4:
                monthName = "April";
                break;
            case 5:
                monthName = "May";
                break;
            case 6:
                monthName = "June";
                break;
            case 7:
                monthName = "July";
                break;
            case 8:
                monthName = "August";
                break;
            case 9:
                monthName = "September";
                break;
            case 10:
                monthName = "October";
                break;
            case 11:
                monthName = "November";
                break;
            case 12:
                monthName = "December";
        }

        return monthName;
    }

     public  void printMonthBody(int year, int month) {

        int startDay = getStartDay(year, month);
        int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);
        int i = 0;

        for (i = 0; i < startDay; i++) {
            System.out.print("    ");
        }

        for (i = 1; i <= numberOfDaysInMonth; i++) {
            System.out.printf("%4d", i);

            if ((i + startDay) % 7 == 0) {
                System.out.println();
            }
        }

        System.out.println();
    }

    /**
     * Get the start day of month/1/year
     */
     public   int getStartDay(int year, int month) {
        int dayOfTheWeek;

        if (month == 2) {
            month = 14;
            year -= 1;
        }

        if (month == 1) {
            month = 13;
            year -= 1;
        }

        dayOfTheWeek = (1 + (26 * (month + 1)) / 10 + (year % 100)
                + ((year % 100) / 4) + ((year / 100) / 4) + (5 * (year / 100))) % 7;

        switch (dayOfTheWeek) {
            case 0:
                return 6;
            default:
                return dayOfTheWeek - 1;
        }
    }

    /**
     * Get the total number of days since January 1, 1800
     */
     public  int getTotalNumberOfDays(int year, int month) {
        int total = 0;

        // Get the total days from 1800 to 1/1/year
        for (int i = 1800; i < year; i++) {
            if (isLeapYear(i)) {
                total = total + 366;
            } else {
                total = total + 365;
            }
        }
        // Add days from Jan to the month prior to the calendar month
        for (int i = 1; i < month; i++) {
            total = total + getNumberOfDaysInMonth(year, i);
        }

        return total;
    }

    /**
     * Get the number of days in a month
     */
   public   int getNumberOfDaysInMonth(int year, int month) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
                || month == 10 || month == 12) {
            return 31;
        }

        if (month == 4 || month == 6 || month == 9 || month == 11) {
            return 30;
        }

        if (month == 2) {
            return isLeapYear(year) ? 29 : 28;
        }

        return 0; // If month is incorrect
    }

    /**
     * Determine if it is a leap year
     */
     public   boolean isLeapYear(int year) {
        return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
    }
    
    
        public static void main(String[] args) {
        	
                       APlusCalendar  cale= new APlusCalendar();



    }
    
    
}